package com.atech.ebayadmin.common.util;

import java.util.*;
import java.text.*;

public class DateUtil {
    private static HashMap<String, SimpleDateFormat> cache = new HashMap<String, SimpleDateFormat>();
    private static Calendar cal = Calendar.getInstance();
    
    /**
     * 按照指定的格式format格式化日期
     * @param date
     * @param format
     * @return
     */
    public static String formatDate(Date date, String format){
        return getFormater(format).format(date);
    }
    
    /**
     * 取指定日期内最小时间（一天的开始时间），
     * 适用于按时间范围搜索数据时格式化开始日期。
     * @param date
     * @return
     */
    public static synchronized Date floor(Date date){
        cal.setTime(date);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
    
    /**
     * 判断指定时间是否在一个时间段内
     * @param begin 时间段的开始，可为空。若值为空，则忽略比较
     * @param endDate 时间段的结束，可为空。若值为空，则忽略比较
     * @param compareDate
     * @param timeInclude 判断是是否考虑时间部分，如果不考虑，则只取日期部分进行判断
     * @return
     */
    public static boolean isBetween(Date begin, Date endDate, Date compareDate, 
                                    boolean timeInclude) {
        if (!timeInclude) {
            begin = begin == null ? null : floor(begin);
            endDate = endDate == null ? null : ceil(endDate);
        }
        if (begin != null && compareDate.before(begin)
            || endDate != null && !compareDate.before(endDate)) {
            return false;
        }
        return true;
    }
    
    /**
     * 判断指定时间是否在一个时间段内
     * @param beginTime 时间段的开始，可为空。若值为空，则忽略比较
     * @param endTime 时间段的结束，可为空。若值为空，则忽略比较
     * @param compareDate
     * @param timeInclude  判断是是否考虑时间部分，如果不考虑，则只取日期部分进行判断
     * @param timeFormat beginTime和endTime的时间格式，如"yyyyMMdd HH:mm:ss"
     * @return
     */
    public static boolean isBetween(String beginTime, String endTime, Date compareDate, 
                                    boolean timeInclude, String timeFormat) {
        return isBetween(beginTime == null ? null : parseDate(beginTime, timeFormat), 
                         endTime == null ? null : parseDate(endTime, timeFormat), 
                         compareDate, timeInclude);
    }
    
    /**
     * 取指定日期内最大时间（一天的结束时间也就是第二天的开始时间），
     * 适用于按时间范围搜索数据时格式化结束日期。
     * @param date
     * @return
     */
    public static synchronized Date ceil(Date date){
        cal.setTime(date);
        cal.add(Calendar.DAY_OF_MONTH, 1);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }
    
    public static synchronized Date parseDate(String date, String format, Date errorReturn) {
        if (date == null || date.trim().length() == 0) {
            return errorReturn;
        }
        try {
            return getFormater(format).parse(date);
        } catch (java.text.ParseException ex) {
            return errorReturn;
        }
    }
    
    public static Date parseDate(String date, String format) {
        try {
            return getFormater(format).parse(date);
        }catch(ParseException ex) {
            ex.printStackTrace();
            return null;
        }
    }
    private static synchronized SimpleDateFormat getFormater(String format){
        SimpleDateFormat sdf = (SimpleDateFormat)cache.get(format);
        if (sdf == null){
            sdf = new SimpleDateFormat(format);
            cache.put(format, sdf);
        }
        return sdf;
    }
    
    /**
     * 判断输入的参数是否是Date类型 
     * @param strValue  输入参数
     * @return boolean  True:是Date类型;False:不是Date类型
     */
    public static boolean isDate(String strValue) {
        if (strValue == null || "".equals(strValue.trim())) {
            return false;
        }

        try {
            DateFormat df = DateFormat.getDateInstance();
            df.parse(strValue.trim());
            return true;
        } catch (Exception e) {
            return false;
        }
    }
    /**
     * 格式话日期，日期格式固定为：yyyy-MM-dd HH:mm:ss
     * @param myDate
     * @return
     * @deprecated
     */
    public static String fotmatDate3(Date myDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String strDate = formatter.format(myDate);
        return strDate;
    }
    
    /**
     * 时间加/减
     * @param time 需要做加/减操作的时间
     * @param field 加/减的域
     * @param amount 加/减的值
     * @return
     * @see Calendar.DAY_OF_MONTH
     */
    public static Date add(Date time, int field, int amount) {
        cal.setTime(time);
        cal.add(field, amount);
        return cal.getTime();
    }
 
}
